package com.ybkj.daijia.config;

import com.ybkj.daijia.serverUtils.AesEncryptUtil;
import com.ybkj.daijia.serverUtils.Md5Util;
import com.ybkj.daijia.serverUtils.ZWYUtil;
import com.ybkj.daijia.server.mapper.ZWYTokenMapper;
import com.ybkj.daijia.server.model.ZWYTokenEntity;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 醉无忧-人保
 *
 * @author 秦波
 */
@Component
public class ZWYApi {

    /**
     * 类型
     */
    public static String TYPE = "cuponnoLock";
    /**
     * 类型
     */
    public static String ORFER_INFO_TYPE = "syncOrderInfo";
    /**
     * 生产：http://club.epicc.com.cn 测试：http://210.13.248.162:8000
     */
    private final String URL_ADDRESS = "";
     /**
     * 获取token接口
     */
    private final String TOKEN = URL_ADDRESS + "/api/token/create";
    /**
     * 刷新token接口
     */
    private final String REFRESH_TOKEN = URL_ADDRESS + "/api/token/refresh";
    /**
     * 第三方凭证码锁定接口
     */
    private final String CUPONNO_LOCK = URL_ADDRESS + "/api/cuponnoInfo/cuponnoLock";
    /**
     * 订单状态信息同步接口
     */
    private final String PUSH_ORDER_INFO = URL_ADDRESS + "/api/orderInfo/syncOrderInfo";
    @Autowired
    private ZWYTokenMapper zWYTokenMapper;

    /**
     * 第三方订单状态信息同步接口
     *
     * @param orderNo      人保俱乐部订单号
     * @param cuponNo      凭证码
     * @param outerOrderId 第三方订单号
     * @param status       第三方订单状态
     * @param connectPhone 联系人电话
     */
    public void syncOrderInfo(String orderNo, String cuponNo, String outerOrderId, String status,
        String connectPhone) {
//        try {
//            String channel = ZWYUtil.CHANNEL;
//            String username = ZWYUtil.USERNAME;
//            String orderNos = orderNo;
//            String cuponNos = cuponNo;
//            String outerOrderIds = outerOrderId;
//            String statuss = status;
//            String connectPhones = connectPhone;
//            orderNo = AesEncryptUtil.AESEncode(ZWYUtil.KEY, orderNo);
//            cuponNo = AesEncryptUtil.AESEncode(ZWYUtil.KEY, cuponNo);
//            channel = AesEncryptUtil.AESEncode(ZWYUtil.KEY, channel);
//            username = AesEncryptUtil.AESEncode(ZWYUtil.KEY, username);
//            outerOrderId = AesEncryptUtil.AESEncode(ZWYUtil.KEY, outerOrderId);
//            status = AesEncryptUtil.AESEncode(ZWYUtil.KEY, status);
//            connectPhone = AesEncryptUtil.AESEncode(ZWYUtil.KEY, connectPhone);
//            Map<String, String> date = new HashMap<String, String>();
//            date.put("orderNo", orderNo);
//            date.put("cuponNo", cuponNo);
//            date.put("channel", channel);
//            date.put("username", username);
//            date.put("outerOrderId", outerOrderId);
//            date.put("status", status);
//            date.put("connectPhone", connectPhone);
//            Map<String, String> kv = new HashMap<String, String>();
//            kv.put("uuid", ZWYUtil.UUID);
//
//            String time = System.currentTimeMillis() + "";
//            kv.put("timeStamp", time);
//            Map<String, String> token = getTokenAndRefreshToken(null, null);
//            kv.put("token", token.get("token"));
//            kv.put("data", date.toString());
//            String sign = "uuid" + ZWYUtil.UUID + "timeStamp" + time + "token" + token.get("token") + "orderNo"
//                    + orderNo + "cuponNo" + cuponNo + "channel" + channel + "username" + username + "outerOrderId"
//                    + outerOrderId + "status" + status + "connectPhone" + connectPhone;
//            kv.put("sign", ZWYUtil.sign(sign));
//            String result = ZWYUtil.getUrl(PUSH_ORDER_INFO, kv);
//            resultVoid(result, ORFER_INFO_TYPE, orderNos, cuponNos, outerOrderIds, statuss, connectPhones);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }

    /**
     * 第三方凭证码锁定接口
     *
     * @param orderNo      人保俱乐部订单号
     * @param cuponNo      凭证码
     * @param outerOrderId 第三方订单号
     * @param connectPhone 联系人电话
     */
    public void cuponnoLock(String orderNo, String cuponNo, String outerOrderId,
        String connectPhone) {
//        try {
//            String channel = ZWYUtil.CHANNEL;
//            String username = ZWYUtil.USERNAME;
//            String orderNos = orderNo;
//            String cuponNos = cuponNo;
//            String outerOrderIds = outerOrderId;
//            String connectPhones = connectPhone;
//            orderNo = AesEncryptUtil.AESEncode(ZWYUtil.KEY, orderNo);
//            cuponNo = AesEncryptUtil.AESEncode(ZWYUtil.KEY, cuponNo);
//            channel = AesEncryptUtil.AESEncode(ZWYUtil.KEY, channel);
//            username = AesEncryptUtil.AESEncode(ZWYUtil.KEY, username);
//            outerOrderId = AesEncryptUtil.AESEncode(ZWYUtil.KEY, outerOrderId);
//            connectPhone = AesEncryptUtil.AESEncode(ZWYUtil.KEY, connectPhone);
//            Map<String, String> date = new HashMap<String, String>();
//            date.put("orderNo", orderNo);
//            date.put("cuponNo", cuponNo);
//            date.put("channel", channel);
//            date.put("username", username);
//            date.put("outerOrderId", outerOrderId);
//            date.put("connectPhone", connectPhone);
//            Map<String, String> kv = new HashMap<String, String>();
//            kv.put("uuid", ZWYUtil.UUID);
//            String time = System.currentTimeMillis() + "";
//            kv.put("timeStamp", time);
//            Map<String, String> token = getTokenAndRefreshToken(null, null);
//            kv.put("token", token.get("token"));
//            kv.put("data", date.toString());
//            String sign = "uuid" + ZWYUtil.UUID + "timeStamp" + time + "token" + token.get("token") + "orderNo"
//                    + orderNo + "cuponNo" + cuponNo + "channel" + channel + "username" + username + "outerOrderId"
//                    + outerOrderId + "connectPhone" + connectPhone;
//            kv.put("sign", ZWYUtil.sign(sign));
//            String result = ZWYUtil.getUrl(CUPONNO_LOCK, kv);
//            resultVoid(result, TYPE, orderNos, cuponNos, outerOrderIds, null, connectPhones);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }

    /**
     * 获取获取token或者刷新TOKEN
     * <p>
     * 获取新的token和refresh_toke; 使用条件： 1-token和refresh_toke为null ----调用getToken; 2-refresh_toke过期
     * ----调用getToken; 3-refresh_token未过期 ----调用refreshToken;
     * <p>
     * token有效时长：1天; refresh_token有效时长：30天;
     */
    public Map<String, String> getTokenAndRefreshToken(Integer tokenCode,
        Integer refreshTokenCode) {
        String token = "";
        String refreshToken = "";
        Map<String, String> map = new HashMap<String, String>();
        ZWYTokenEntity zwy = zWYTokenMapper.selectByAll();
        try {
            if (null == zwy && null == tokenCode && null == refreshTokenCode) {
                // 调用请求新token接口
                Map<String, String> tokenMap = getToken();
                String error = tokenMap.get("error");
                if (error.equals(ZWYUtil.OK + "")) {
                    token = tokenMap.get("token");
                    refreshToken = tokenMap.get("refreshToken");
                    ZWYTokenEntity insert = new ZWYTokenEntity();
                    insert.setToken(token);
                    insert.setRefreshToken(refreshToken);
                    zWYTokenMapper.insertRecord(insert);
                }
            } else if (null != zwy && null != zwy.getToken() && null != zwy.getRefreshToken()) {

                if (null == tokenCode && null == refreshTokenCode) {
                    token = zwy.getToken();
                    refreshToken = zwy.getRefreshToken();
                } else if (null != tokenCode && tokenCode.equals(ZWYUtil.TOKEN_CODE)
                    && null == refreshTokenCode) {
                    // 调用刷新token接口
                    Map<String, String> tokenMap = getRefreshToken(zwy.getRefreshToken());
                    String error = tokenMap.get("error");
                    if (error.equals(ZWYUtil.OK + "")) {
                        token = tokenMap.get("token");
                        refreshToken = tokenMap.get("refreshToken");
                        update(token, refreshToken, zwy.getId());
                    }
                } else if (null != refreshTokenCode && refreshTokenCode
                    .equals(ZWYUtil.REFRESH_TOKEN_CODE)) {
                    // 调用请求新token接口
                    Map<String, String> tokenMap = getToken();
                    String error = tokenMap.get("error");
                    if (error.equals(ZWYUtil.OK + "")) {
                        token = tokenMap.get("token");
                        refreshToken = tokenMap.get("refreshToken");
                        update(token, refreshToken, zwy.getId());
                    }
                }
            } else {
                // 调用请求新token接口
                Map<String, String> tokenMap = getToken();
                String error = tokenMap.get("error");
                if (error.equals(ZWYUtil.OK + "")) {
                    token = tokenMap.get("token");
                    refreshToken = tokenMap.get("refreshToken");
                    ZWYTokenEntity insert = new ZWYTokenEntity();
                    insert.setToken(token);
                    insert.setRefreshToken(refreshToken);
                    zWYTokenMapper.insertRecord(insert);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        map.put("token", token);
        map.put("refreshToken", refreshToken);
        return map;
    }

    /**
     * 请求新的token
     *
     * @return Map
     */
    public Map<String, String> getToken() {
        String result = "";
        try {
            Map<String, String> kv = new HashMap<String, String>();
            long time = System.currentTimeMillis();
            kv.put("timeStamp", time + "");
            kv.put("userName", ZWYUtil.USERNAME);
            kv.put("passWord",
                AesEncryptUtil.AESEncode(ZWYUtil.KEY, Md5Util.md532(ZWYUtil.PASSWORD)));
            String sign = "timeStamp" + time + "passWord"
                + AesEncryptUtil.AESEncode(ZWYUtil.KEY, Md5Util.md532(ZWYUtil.PASSWORD))
                + "userName"
                + ZWYUtil.USERNAME;
            kv.put("sign", ZWYUtil.sign(sign));
            result = ZWYUtil.getUrl(TOKEN, kv);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result(result);
    }

    /**
     * 刷新的token
     *
     * @return Map
     */
    public Map<String, String> getRefreshToken(String refreshToken) {
        String result = "";
        try {
            Map<String, String> kv = new HashMap<String, String>();
            kv.put("clientId", ZWYUtil.CLIENT_ID);
            kv.put("clientSecret", AesEncryptUtil.AESEncode(ZWYUtil.KEY, ZWYUtil.CLIENTID_SECRET));
            kv.put("refreshToken", refreshToken);
            long time = System.currentTimeMillis();
            kv.put("timeStamp", time + "");
            String sign = "clientId" + ZWYUtil.CLIENT_ID + "clientSecret"
                + AesEncryptUtil.AESEncode(ZWYUtil.KEY, ZWYUtil.CLIENTID_SECRET) + "refreshToken"
                + refreshToken
                + "timeStamp" + time;
            kv.put("sign", ZWYUtil.sign(sign));
            result = ZWYUtil.getUrl(REFRESH_TOKEN, kv);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result(result);
    }

    /**
     * 解析token
     *
     * @param result 返回的数据
     * @return Map
     */
    public Map<String, String> result(String result) {
//        String token = "";
//        String refreshToken = "";
//        Map<String, String> map = new HashMap<String, String>();
//        try {
//            if (StringUtils.isNotBlank(result)) {
//                JSONObject jo = new JSONObject(result);
//                Integer code = jo.getInt("code");
//                /*
//                 * code msg 1000000 成功 1000001 系统异常 1000002 非法参数 1000003 必需参数为空 1000004 时间戳已过期
//                 * 1000005 uuid身份验证失败 1000006 token错误 1000007 token过期 1000008 sign签名错误 1000009
//                 * 没有该地址访问权限 2000001 必需业务参数为空 2000002 解密参数失败 2000003 参数中含有非法字符 2001001
//                 * 获取token用户名或密码不正确 2001002 刷新token客户端id或秘钥不正确 2001003 已有token,请刷新 2001004
//                 * 无效refreshtoken 2001005 refreshToken过期 2004001 订单号为空 2004002 订单号含非法字符 2004003
//                 * 订单号长度过长 2004004 第三方订单号为空 2004005 第三方订单号含有非法字符 2004006 第三方订单号长度过长 2004007
//                 * 凭证码为空 2004008 凭证码含有非法字符 2004009 凭证码长度过长 2004010 第三方公司标识为空 2004011
//                 * 第三方公司标识含有特殊字符 2004012 第三方公司标识长度过长 2004013 第三方商户名称为空 2004014 第三方商户名称含特殊字符
//                 * 2004015 第三方商户名称长度过长 2004016 第三方订单状态为空 2004017 第三方订单状态长度过长 2004018 订单号不一致
//                 * 2004019 第三方订单号不一致 2004020 凭证码不存在 2004021 该凭证码所属订单未生效或已撤销，无法核销 2004022 该凭证码已验证
//                 * 2004023 该凭证码未锁定 2004024 第三方订单状态异常，无法核销 2004026 凭证码不存在 2004027 凭证码已被其他订单锁定
//                 */
//                if (code.equals(ZWYUtil.RET)) {
//                    Object object = jo.get("data");
//                    if (null != object && !object.toString().equals("null")) {
//                        JSONObject data = jo.getJSONObject("data");
//                        token = data.getString("token");
//                        refreshToken = data.getString("refreshToken");
//                        map.put("error", ZWYUtil.OK + "");
//                        map.put("token", token);
//                        map.put("refreshToken", refreshToken);
//                        return map;
//                    }
//                } else if (code.equals(ZWYUtil.TOKEN_CODE_ERR)) {
//                    getTokenAndRefreshToken(ZWYUtil.TOKEN_CODE, null);
//                } else {
//                    System.out.println("醉无忧token返回错误信息：" + jo.getString("msg"));
//                    map.put("error", ZWYUtil.NO + "");
//                    map.put("token", token);
//                    map.put("refreshToken", refreshToken);
//                    return map;
//                }
//            }
//            map.put("error", ZWYUtil.NO + "");
//            map.put("token", token);
//            map.put("refreshToken", refreshToken);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
        return new Map<String, String>() {
            @Override
            public int size() {
                return 0;
            }

            @Override
            public boolean isEmpty() {
                return false;
            }

            @Override
            public boolean containsKey(Object key) {
                return false;
            }

            @Override
            public boolean containsValue(Object value) {
                return false;
            }

            @Override
            public String get(Object key) {
                return null;
            }

            @Override
            public String put(String key, String value) {
                return null;
            }

            @Override
            public String remove(Object key) {
                return null;
            }

            @Override
            public void putAll(Map<? extends String, ? extends String> m) {

            }

            @Override
            public void clear() {

            }

            @Override
            public Set<String> keySet() {
                return null;
            }

            @Override
            public Collection<String> values() {
                return null;
            }

            @Override
            public Set<Entry<String, String>> entrySet() {
                return null;
            }
        };
    }

    /**
     * 解析业务接口
     *
     * @param result 返回的数据
     * @return Map
     */
    public void resultVoid(String result, String type, String orderNo, String cuponNo,
        String outerOrderId,
        String status, String connectPhone) {

//        if (StringUtils.isNotBlank(result)) {
//            JSONObject jo = new JSONObject(result);
//            Integer code = jo.getInt("code");
//            if (code.equals(ZWYUtil.RET)) {
//                // 请求成功
//            } else if (code.equals(ZWYUtil.TOKEN_CODE)) {
//                getTokenAndRefreshToken(ZWYUtil.TOKEN_CODE, null);
//                // if (type.equals(TYPE)) {
//                // // 请求错误后再尝试获取一次
//                // cuponnoLock(orderNo, cuponNo, outerOrderId, connectPhone);
//                // } else {
//                // // 请求错误后再尝试获取一次
//                // syncOrderInfo(orderNo, cuponNo, outerOrderId, status, connectPhone);
//                // }
//            } else if (code.equals(ZWYUtil.REFRESH_TOKEN_CODE)) {
//                getTokenAndRefreshToken(null, ZWYUtil.REFRESH_TOKEN_CODE);
//                // if (type.equals(TYPE)) {
//                // // 请求错误后再尝试获取一次
//                // cuponnoLock(orderNo, cuponNo, outerOrderId, connectPhone);
//                // } else {
//                // // 请求错误后再尝试获取一次
//                // syncOrderInfo(orderNo, cuponNo, outerOrderId, status, connectPhone);
//                // }
//            } else {
//                System.out.println("醉无忧业务返回错误信息：" + jo.getString("msg"));
//            }
//        }
    }

    /**
     * 修改
     *
     * @param token        token
     * @param refreshToken refreshToken
     */
    public void update(String token, String refreshToken, Long id) {
//        ZWYTokenEntity update = new ZWYTokenEntity();
//        update.setToken(token);
//        update.setRefreshToken(refreshToken);
//        update.setId(id);
//        zWYTokenMapper.updateByPrimaryKey(update);
    }
}